package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.controller.EmpController;
import com.itheima.entity.*;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.awt.print.Pageable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;


@Service
public class EmpServiceImpl implements EmpService {

    private final Logger log = LoggerFactory.getLogger(EmpController.class);
    @Autowired
    private EmpMapper empMapper;


    @Autowired
    private EmpExprMapper empExprMapper;


    @Autowired
    private EmpLogService empLogService;



//    /**
//     * 分页查询
//     * @param page  页码
//     * @param pageSize  每页记录数
//     * @return
//     */
//    @Override
//    public PageBean page(Integer page, Integer pageSize) {
//        //1.调用mapper获取总记录数 total
//        Long total = empMapper.count();
//        //2.调用mapper获取分页数据 rows
//        Integer start = (page - 1) * pageSize;
//        List<Emp> empList = empMapper.page(start,pageSize);
//        //3.封装PageBean对象并返回
//
//        return new PageBean(total,empList);
//    }


//    @Override
//    public PageBean page(Integer page, Integer pageSize) {
//
//        //1.设置分页参数
//        PageHelper.startPage(page, pageSize);
//        //2.调用mapper的查询方法
//        List<Emp> empList = empMapper.list();
//
//        //分页只会对PageHelper.startPage下面的第一条select进行处理
//        //List<Emp> empList2 = empMapper.list();
//        //3.封装pagebean对象并返回
//
//        Page p = (Page) empList;//page继承了arraylist
//
//        return new PageBean(p.getTotal(), p.getResult());
//    }

//    @Override
//    public PageBean page(String name, Integer gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
//
//        //1.设置分页参数
//        PageHelper.startPage(page, pageSize);
//        //2.调用mapper的查询方法
//        List<Emp> empList = empMapper.list(name,gender,begin,end);
//
//        //分页只会对PageHelper.startPage下面的第一条select进行处理
//        //List<Emp> empList2 = empMapper.list();
//        //3.封装pagebean对象并返回
//
//        Page p = (Page) empList;//page继承了arraylist
//
//        return new PageBean(p.getTotal(), p.getResult());
//    }

    @Override
    public PageBean page(EmpQueryParam param) {
        //1.设置分页参数
        PageHelper.startPage(param.getPage(), param.getPageSize());
        //2.调用mapper的查询方法
        List<Emp> empList = empMapper.list(param);

        //分页只会对PageHelper.startPage下面的第一条select进行处理
        //List<Emp> empList2 = empMapper.list();
        //3.封装pagebean对象并返回

        Page p = (Page) empList;//page继承了arraylist

        return new PageBean(p.getTotal(), p.getResult());
    }
    @Transactional//开启事务
    @Override
    public void save(Emp emp) {
        try {
            //1.调用mapper，保存员工的信息到emp表
            //1.1补充缺失的字段
            emp.setPassword("123456");
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            empMapper.insert(emp);
            //2.调用mapper，保存员工的工作经历到emp_expr
            List<EmpExpr> exprList = emp.getExprList();
            //2.1关联员工id
            if (!CollectionUtils.isEmpty(exprList)) {
                exprList.forEach((expr) -> {
                    expr.setEmpId(emp.getId());
                });
            //2.2批量保存
                empExprMapper.insertBatch(exprList);

            }
        } finally {
            //无论新增员工成功与否，都要添加操作日志
            EmpLog empLog = new EmpLog();
            empLog.setOperateTime(LocalDateTime.now());
            empLog.setInfo("插入员工信息："+emp);
            empLogService.insertLog(empLog);
        }

    }

    /**
     * 删除员工
     * @param ids
     */
    @Override
    @Transactional//开启事务（涉及到多张表的删除操作）
    public void delete(List<Integer> ids) {
        //1.删除员工的基本数据emp表
        empMapper.deleteBatch(ids);
        //2.删除员工的经历信息数据emp_expr表
        empExprMapper.deleteBach(ids);

    }

    @Override
    public Emp getById(Integer id) {
        //1.调用mapper的查询方法，获取员工基本信息和经历列表信息
        return empMapper.getById(id);
    }

    @Override
    public EmpLoginInfo login(Emp emp) {
        //1.调用mapper查询员工

        Emp empDB = empMapper.selectUsernameAndPassword(emp);
        //2.判断员工是否存在
        if (empDB!=null){
            //3.如果查到对象就构造EmpLoginInfo对象返回
            //完善登陆逻辑，登陆成功需要JWT令牌
            Map<String,Object> claims = new HashMap<>();
            //自定义有效载荷
            claims.put("id",empDB.getId());
            claims.put("username",empDB.getUsername());
            String jwt = JwtUtils.generateJwt(claims);

            return new EmpLoginInfo(empDB.getId(), empDB.getUsername(), empDB.getName(),jwt);

        }

        return null;
    }


}
